package com.ybox.crawler.process.original;

import com.ybox.common.core.utils.StringUtils;
import com.ybox.crawler.config.CrawlerConfig;
import com.ybox.crawler.domain.core.parse.ParseItem;
import com.ybox.crawler.domain.enums.CrawlerEnum;
import com.ybox.crawler.process.AbstractProcessFlow;
import com.ybox.crawler.process.entity.ProcessFlowData;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;

/**
 * 初始化URL前置处理器
 * @author 16554
 */
@Log4j2
public abstract class AbstractOriginalDataProcess extends AbstractProcessFlow {

    @Autowired
    private CrawlerConfig crawlerConfig;

    /**
     * 数据处理方法
     *
     * @param processFlowData processFlowData
     */
    @Override
    public void handel(ProcessFlowData processFlowData) {
        //初始化URL数据列表
        List<ParseItem> initialDataList = processFlowData.getParseItemList();
        if (!(null != initialDataList && !initialDataList.isEmpty())) {
            //解析初始URL获取需要抓取的URL链接
            log.info("获取初始化URL列表");
            initialDataList = parseOriginalRequestData(processFlowData);
            log.info("初始化URL列表完成，有效URL数量：{}", initialDataList.size());
            //初始化方法的一些处理，这里面是一个空方法，没有任何实现
            initialDataListHandel(initialDataList);
        }
        if (null != initialDataList && !initialDataList.isEmpty()) {
            //数据添加到Spider中
            if (initialDataList.get(0).getInitialUrl().contains("zhihu")){
                addSpiderMobileRequest(initialDataList);
            }else {
                addSpiderRequest(initialDataList);
            }

        } else {
            log.error("没有有效的初始化URL列表");
        }

        //后置处理，这里是一个空的实现
        postprocess(processFlowData);
    }

    /**
     * 后置处理
     *
     * @param processFlowData processFlowData
     */
    public void postprocess(ProcessFlowData processFlowData) {}


    /**
     * 解析初始的数据
     * @param processFlowData processFlowData
     * @return
     */
    public abstract List<ParseItem> parseOriginalRequestData(ProcessFlowData processFlowData);

    /**
     * 初始数据存储
     *
     * @param initialDataList initialDataList
     */
    public void initialDataListHandel(List<ParseItem> initialDataList) {}

    @Override
    public CrawlerEnum.ComponentType getComponentType() {
        return CrawlerEnum.ComponentType.NORMAL;
    }

    /**
     * 获取初始url列表
     * @return List<String>
     */
    public List<String> getInitUrlList(ProcessFlowData processFlowData){
        if (StringUtils.isNotEmpty(processFlowData.getCustomUrl())){
            ArrayList<String> strings = new ArrayList<>();
            strings.add(processFlowData.getCustomUrl());
            return strings;
        }
        CrawlerEnum.CrawlerType crawlerType = getCrawlerType();
        if (crawlerType == CrawlerEnum.CrawlerType.JUEJIN) {
            return crawlerConfig.getInitJuejinUrlList();
        }else if (crawlerType == CrawlerEnum.CrawlerType.WEIXIN) {
            return crawlerConfig.getInitJuejinUrlList();
        }
        return crawlerConfig.getInitCsdnUrlList();
    }

}
